def sep(label=''):
    '''
    Utility function, to separate command line output.
    :param label: Optional label.
    :return: None
    '''
    print('-' * 16, label, '-' * 16)


# 1．创建一个列表ranking，保存2016年里约奥运会的排名前５的国家和金牌数量：
print('1．创建一个列表ranking，保存2016年里约奥运会的排名前５的国家和金牌数量：')
ranking = [('美国', 46),
           ('英国', 27),
           ('中国', 26),
           ('俄罗斯', 19),
           ('德国', 17),
           ('日本', 12)]

# 2．实现一个函数showRanking（n）
# 参数：n, 代表要输出的国家的个数, 默认值为５
# 返回值：无
# 功能描述：调用该函数时，显示ranking中排名前n(n <= 6)
# 的国家，并在前面加上名次编号。
# 数据显示格式如下：
print('2．实现一个函数showRanking（n）')


def showRanking(n=5):
    '''
    显示前n个国家的金牌数量
    :param n: 行数
    :return: None
    '''
    if n < 0:
        n = 0
    if n > 6:
        n = 6
    print('2016年里约奥运会的排名：')
    for i in range(n):
        print(f'第{i + 1}名: {ranking[i][0]}, 获金牌{ranking[i][1]}枚')


# 3．实现一个函数showSelRanking（str）：
# 参数：str，一个国家名称
# 返回值：返回该国家的金牌数量
# 功能描述：在调用该函数时，传递一个国家名称，该函数返回指定相应国家的金牌数量。如果该国家不在排行榜上，则提示“榜上无名”
print('3．实现一个函数showSelRanking（str）')


def showSelRanking(str):
    '''
    返回该国家的金牌数量
    如果该国家不在排行榜上，则提示“榜上无名”
    :param str: 一个国家名称
    :return: 该国家的金牌数量
    '''
    for tup in ranking:
        if tup[0] == str:
            return tup[1]
    return '榜上无名'


# 4．实现一个函数showPrize()
# 参数：无
# 返回值：前３名国家的金牌数量之和
# 功能描述：在调用该函数时，该函数计算并返回前３名国家的金牌数量之和
print('4．实现一个函数showPrize()')


def showPrize():
    '''
    返回前３名国家的金牌数量之和
    :return: 前３名国家的金牌数量之和
    '''
    xsum = 0
    for i in range(3):
        xsum += ranking[i][1]
    return xsum


# 5．实现一个函数showDelRanking（sel）
# 参数：sel，一个国家排名编号
# 返回值：无
# 功能描述：在调用该函数时，首先显示榜上前sel名国家及金牌数量；
# 接着根据参数传递的编号，该函数会从ranking中删除指定编号的国家和金牌数量；
# 最后再次显示榜上国家及金牌数量；
# 提示：调用函数showRanking（n）
print('5．实现一个函数c（sel）')


def showDelRanking(sel):
    '''
    在调用该函数时，首先显示榜上前sel名国家及金牌数量；
    接着根据参数传递的编号，该函数会从ranking中删除指定编号的国家和金牌数量；
    最后再次显示榜上国家及金牌数量
    :param sel: 编号
    :return: None
    '''
    # 首先显示榜上前sel名国家及金牌数量
    print('2016年里约奥运会的排名：')
    for i in range(sel):
        print(f'第{i + 1}名: {ranking[i][0]}, 获金牌{ranking[i][1]}枚')
    # 根据参数传递的编号，该函数会从ranking中删除指定编号的国家和金牌数量
    ranking.pop(sel - 1)
    # 再次显示榜上国家及金牌数量
    print('2016年里约奥运会的排名：')
    num = 1
    for tup in ranking:
        print(f'第{num}名: {tup[0]}, 获金牌{tup[1]}枚')
        num += 1


# 6．测试上面几个函数的功能，结果正确。
print('6．测试上面几个函数的功能，结果正确。')
sep()
# 调用显示国家的函数showRanking（）和showRanking（３）。
print('调用显示国家的函数showRanking（）。')
showRanking()
print('调用显示国家的函数showRanking（３）。')
showRanking(3)
sep()
# 调用选择国家的函数：showSelRanking（‘中国’）和showSelRanking（‘几里巴斯’）
print('调用选择国家的函数：showSelRanking（‘中国’）和showSelRanking（‘几里巴斯’）')
print(f'中国的金牌数量：{showSelRanking("中国")}')
print(f'几里巴斯的金牌数量：{showSelRanking("几里巴斯")}')
sep()
# 调用showPrize()
# 并输出。
print(f'前3名国家金牌之和是：{showPrize()}')
sep()
# 调用删除国家的函数。
print('删除第2名')
showDelRanking(2)
